package com.whpost.api.controller.qyh;


import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.whpost.api.entity.ReqLoginQyh;
import com.whpost.service.dao.cwqf.HsCzyMapper;
import com.whpost.service.entity.cwqf.HsCzy;
import com.whpost.service.entity.tools.ResultInfo;
import com.whpost.service.service.cwqf.TCwqfKhjlKhServices;
import com.whpost.service.tools.Aes;
import com.whpost.service.tools.ToolBean;
import com.whpost.service.tools.Url;
import jakarta.annotation.Resource;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.util.RandomUtils;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
import me.chanjar.weixin.cp.bean.WxCpUser;
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@RequestMapping("/qyh/auth")
public class QyhAuthController {
    @Resource(name="cwqfglWxService")
    private WxCpService wxCpService;
    @Resource
    private HsCzyMapper hsCzyMapper;
    @Resource
    private TCwqfKhjlKhServices tCwqfKhjlKhServices;

    /**
     * 使用企业号授权CODE登录
     * @param reqLoginQyh
     * @return
     */
    @PostMapping("/login")
    public ResultInfo login(@RequestBody ReqLoginQyh reqLoginQyh){
        ToolBean.info("qyh/auth/login被访问，reqLogin["+reqLoginQyh.toString()+"]");
        if (null==reqLoginQyh){
            return new ResultInfo(500, "缺少code参数，无法完成登录！",null);
        }
        String code = reqLoginQyh.getCode();
        if (StringUtils.isEmpty(code)){
            return new ResultInfo(500, "缺少code参数，无法完成登录！",null);
        }else{
            try {
                // 1. 通过code获取用户ID（4.5.0版本直接返回用户ID，无需WxCpOauthToken）
                String userId = wxCpService.getOauth2Service().getUserInfo(code).getUserId();
                ToolBean.info("qyh/auth/login被访问，code["+code+"]换取的userId:"+userId);
                // 2. 如需详细用户信息，可进一步查询
                WxCpDefaultConfigImpl config=new WxCpDefaultConfigImpl();
                config.setCorpId("wxf1d5166e31172db9");
                config.setCorpSecret("ESRcPFL7TG09ewk5yBdTbyKJ8DDOGd0g1kHrgmA4rKs");
                config.setAgentId(7);
                WxCpServiceImpl wxCpService1 = new WxCpServiceImpl();
                wxCpService1.setWxCpConfigStorage(config);
                WxCpUser user = wxCpService1.getUserService().getById(userId);
                // 3. 后续登录逻辑（如创建会话、关联本地用户等）
                String userMobile = user.getMobile();

                ToolBean.info("qyh/auth/login被访问，code["+code+"]换取的userMobile:"+userMobile);
                if (StringUtils.isEmpty(userMobile)) {
                    return new ResultInfo(500, "获取用户手机号为空，无法登录！", null);
                }

                userMobile = Url.encrypt(userMobile);


                HsCzy hsCzy = new HsCzy();
                hsCzy = hsCzyMapper.getHsCzyByTel(userMobile);

                if (hsCzy!=null){

                    //如果用户没有秘钥，补充秘钥
                    if (StringUtils.isEmpty(hsCzy.getAeskey()) || StringUtils.isEmpty(hsCzy.getAesiv())){
                        hsCzy.setAeskey(ToolBean.getRandomString(16));
                        hsCzy.setAesiv("0102030405060708");
                        hsCzyMapper.updateById(hsCzy);
                    }
                    //校验完，准备登录
                    StpUtil.login(hsCzy.getCode());
                    // 第2步，获取 Token  相关参数
                    SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
                    // 第3步，返回给前端
                    String token = tokenInfo.getTokenValue();
                    String data = "{\"code\":\"200\",\"token\":\"" + token + "\",\"a\":\"" + hsCzy.getAeskey() + "\",\"b\":\"" + hsCzy.getAesiv() + "\",\"c\":\"" + hsCzy.getCode() + "\"}";
                    ToolBean.info("登录成功，准备加密后返回的字符串:"+data);
                    String rtnStr = Aes.encrypt(data,"NLfZ3aIOg77E2rT8");
                    return new ResultInfo(200, "登录成功！",rtnStr);
                }else{
                    return new ResultInfo(500, "用户没有访问权限！请在后台维护用户信息！", null);
                }

            } catch (Exception e) {
                e.printStackTrace();
                return new ResultInfo(500, "登录失败：" + e.getMessage(),null);
            }
        }

    }

    /**
     * 获取企业号授权地址
     */
    @GetMapping("/buildOauth2Url")
    public ResultInfo oauth2Url(String redirect){
        String redirectUrl=wxCpService.getWxCpConfigStorage().getOauth2redirectUri();
        if(!StringUtils.isEmpty(redirect)){
            redirectUrl=redirectUrl+"?redirect="+redirect;
        }
        String url=wxCpService.getOauth2Service().buildAuthorizationUrl(redirectUrl, RandomUtils.getRandomStr(), WxConsts.OAuth2Scope.SNSAPI_PRIVATEINFO);
        return new ResultInfo(200, "获取企业号授权地址成功！",url);
    }

    /**
     * 使用企业号授权CODE登录
     * @param reqLoginQyh
     * @return
     */
    @PostMapping("/login_sjh")
    public ResultInfo loginSjh(@RequestBody ReqLoginQyh reqLoginQyh){
        ToolBean.info("qyh/auth/login_sjh被访问，reqLogin["+reqLoginQyh.toString()+"]");
        if (null==reqLoginQyh){
            return new ResultInfo(500, "缺少手机号，无法完成登录！",null);
        }
        String code = reqLoginQyh.getCode();
        if (StringUtils.isEmpty(code)){
            return new ResultInfo(500, "缺少手机号，无法完成登录！",null);
        }else{
            try {
                // 3. 后续登录逻辑（如创建会话、关联本地用户等）
                String userMobile = code;

                ToolBean.info("qyh/auth/login_sjh被访问，userMobile:"+userMobile);
                if (StringUtils.isEmpty(userMobile)) {
                    return new ResultInfo(500, "获取用户手机号为空，无法登录！", null);
                }

                userMobile = Url.encrypt(userMobile);


                HsCzy hsCzy = new HsCzy();
                hsCzy = hsCzyMapper.getHsCzyByTel(userMobile);

                if (hsCzy!=null){

                    //如果用户没有秘钥，补充秘钥
                    if (StringUtils.isEmpty(hsCzy.getAeskey()) || StringUtils.isEmpty(hsCzy.getAesiv())){
                        hsCzy.setAeskey(ToolBean.getRandomString(16));
                        hsCzy.setAesiv("0102030405060708");
                        hsCzyMapper.updateById(hsCzy);
                    }
                    //校验完，准备登录
                    StpUtil.login(hsCzy.getCode());
                    // 第2步，获取 Token  相关参数
                    SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
                    // 第3步，返回给前端
                    String token = tokenInfo.getTokenValue();
                    String data = "{\"code\":\"200\",\"token\":\"" + token + "\",\"a\":\"" + hsCzy.getAeskey() + "\",\"b\":\"" + hsCzy.getAesiv() + "\",\"c\":\"" + hsCzy.getCode() + "\"}";
                    ToolBean.info("登录成功，准备加密后返回的字符串:"+data);
                    String rtnStr = Aes.encrypt(data,"NLfZ3aIOg77E2rT8");
                    return new ResultInfo(200, "登录成功！",rtnStr);
                }else{
                    return new ResultInfo(500, "用户没有访问权限！请在后台维护用户信息！", null);
                }

            } catch (Exception e) {
                e.printStackTrace();
                return new ResultInfo(500, "登录失败：" + e.getMessage(),null);
            }
        }

    }

    /**
     * 获取企业号授权地址
     */
    @GetMapping("/test")
    public String test(String redirect){
        return "no";
        //return tCwqfKhjlKhServices.test1();
    }
}
